package com.k.Exception;

import java.util.InputMismatchException;
import java.util.Scanner;

/**
 * 异常的处理
 * 程序不因为异常而造成程序的中止
 * try-catch中异常执行的顺序应该从子类到父类的过程，例如以下过程
 * 异常抛出的前后关系只与直接继承关系的异常类有关系
 * */
public class TestTryCatch {
    public static void main(String[] args) {
        Scanner input=new Scanner(System.in);
        System.out.println("请输入被除数：");
        //快捷键ctrl+alt+t
        try {
            int num1=input.nextInt();
            System.out.println("请输入除数");
            int num2=input.nextInt();
            int result=num1 / num2 ;        //new ArithmeticException("/ by zero");
            System.out.println("值="+result);
        } catch (InputMismatchException e){
            System.out.println("请输入有效的整数");
        }catch (ArithmeticException e) {     //e=new ArithmeticException("/ by zero")
            //处理方案1.（自定义处理）
            System.out.println("除数不能为零");
            //处理方案2.（打印堆栈的跟踪信息）
            e.printStackTrace();
            //处理方案3（单独获取Message作为异常的原因）
            /**
             * 关于getMessage()的流程
             * 由异常位置创建一个ArithmeticException("/ by zero")的对象，调用ArithmeticException中的构造方法
             * 再由super(),传递给父类RuntimeException中的构造方法，再次调用super(),传递给父类Exception中
             * 的构造方法，再次调用super(),传递给Throwable的构造方法，并且给Throwable中的私有属性Message进行赋值
             * 再次通过getMessage()得到异常的原因
             * */
            System.out.println(e.getMessage());
        }catch(RuntimeException e){
            System.out.println("未知的运行异常，请联系管理员！");
        }catch (Exception e){
            System.out.println("未知受查异常，请联系管理员！");
        }
        System.out.println("---程序结束---");

    }
}
